#compdef curl

# curl zsh completion

local curcontext="$curcontext" state state_descr line
typeset -A opt_args

local rc=1

_arguments -C -S \
  --aws-sigv4'[Use AWS V4 signature authentication]':'<provider1[\:provider2[\:region[\:service]]]>' \
  {-c,--cookie-jar}'[Write cookies to <filename> after operation]':'<filename>':_files \
  --resolve'[Resolve the host+port to this address]':'<[+]host\:port\:addr[,addr]...>' \
  {-D,--dump-header}'[Write the received headers to <filename>]':'<filename>':_files \
  {-y,--speed-time}'[Trigger '\''speed-limit'\'' abort after this time]':'<seconds>' \
  --proxy-cacert'[CA certificate to verify peer against for proxy]':'<file>':_files \
  --happy-eyeballs-timeout-ms'[Time for IPv6 before trying IPv4]':'<milliseconds>' \
  {-E,--cert}'[Client certificate file and password]':'<certificate[\:password]>' \
  --etag-save'[Parse ETag from a request and save it to a file]':'<file>':_files \
  --libcurl'[Dump libcurl equivalent code of this command line]':'<file>':_files \
  --proxy-capath'[CA directory to verify peer against for proxy]':'<dir>':_files \
  --proxy-pinnedpubkey'[FILE/HASHES public key to verify proxy with]':'<hashes>' \
  --crlfile'[Get a CRL list in PEM format from the given file]':'<file>':_files \
  --etag-compare'[Pass an ETag from a file as a custom header]':'<file>':_files \
  --curves'[(EC) TLS key exchange algorithm(s) to request]':'<algorithm list>' \
  --proxy-negotiate'[Use HTTP Negotiate (SPNEGO) authentication on the proxy]' \
  --mail-rcpt-allowfails'[Allow RCPT TO command to fail for some recipients]' \
  --socks5-hostname'[SOCKS5 proxy, pass host name to proxy]':'<host[\:port]>' \
  --abstract-unix-socket'[Connect via abstract Unix domain socket]':'<path>' \
  --pinnedpubkey'[FILE/HASHES Public key to verify peer against]':'<hashes>' \
  --proxy-insecure'[Do HTTPS proxy connections without verifying the proxy]' \
  --proxy-pass'[Pass phrase for the private key for HTTPS proxy]':'<phrase>' \
  --proxy-ssl-allow-beast'[Allow security flaw for interop for HTTPS proxy]' \
  {-p,--proxytunnel}'[Operate through an HTTP proxy tunnel (using CONNECT)]' \
  --proto-default'[Use PROTOCOL for any URL missing a scheme]':'<protocol>' \
  --proxy-tls13-ciphers'[TLS 1.3 proxy cipher suites]':'<ciphersuite list>' \
  --socks5-gssapi-service'[SOCKS5 proxy service name for GSS-API]':'<name>' \
  --ftp-alternative-to-user'[String to replace USER \[name\]]':'<command>' \
  {-T,--upload-file}'[Transfer local FILE to destination]':'<file>':_files \
  --local-port'[Force use of RANGE for local port numbers]':'<num/range>' \
  --proxy-tlsauthtype'[TLS authentication type for HTTPS proxy]':'<type>' \
  {-R,--remote-time}'[Set the remote file'\''s time on the local output]' \
  --ssl-revoke-best-effort'[Ignore missing/offline cert CRL dist points]' \
  --ftp-ssl-control'[Require SSL/TLS for FTP login, clear for transfer]' \
  --parallel-immediate'[Do not wait for multiplexing (with --parallel)]' \
  --proxy-cert-type'[Client certificate type for HTTPS proxy]':'<type>' \
  {-O,--remote-name}'[Write output to a file named as the remote file]' \
  --retry-connrefused'[Retry on connection refused (use with --retry)]' \
  --sasl-authzid'[Identity for SASL PLAIN authentication]':'<identity>' \
  --suppress-connect-headers'[Suppress proxy CONNECT response headers]' \
  --trace-ascii'[Like --trace, but without hex output]':'<file>':_files \
  --connect-timeout'[Maximum time allowed for connection]':'<seconds>' \
  --expect100-timeout'[How long to wait for 100-continue]':'<seconds>' \
  {-g,--globoff}'[Disable URL sequences and ranges using {} and \[\]]' \
  {-j,--junk-session-cookies}'[Ignore session cookies read from file]' \
  {-m,--max-time}'[Maximum time allowed for the transfer]':'<seconds>' \
  --tls13-ciphers'[TLS 1.3 cipher suites to use]':'<ciphersuite list>' \
  --dns-ipv4-addr'[IPv4 address to use for DNS requests]':'<address>' \
  --dns-ipv6-addr'[IPv6 address to use for DNS requests]':'<address>' \
  {-k,--insecure}'[Allow insecure server connections when using SSL]' \
  --location-trusted'[Like --location, and send auth to other hosts]' \
  --mail-auth'[Originator address of the original email]':'<address>' \
  --noproxy'[List of hosts which do not use proxy]':'<no-proxy-list>' \
  --proto-redir'[Enable/disable PROTOCOLS on redirect]':'<protocols>' \
  --proxy-cert'[Set client certificate for proxy]':'<cert[\:passwd]>' \
  --dns-interface'[Interface to use for DNS requests]':'<interface>' \
  --hostpubmd5'[Acceptable MD5 hash of the host public key]':'<md5>' \
  --keepalive-time'[Interval time for keepalive probes]':'<seconds>' \
  --random-file'[File for reading random data from]':'<file>':_files \
  --socks5-basic'[Enable username/password auth for SOCKS5 proxies]' \
  --cacert'[CA certificate to verify peer against]':'<file>':_files \
  {-H,--header}'[Pass custom header(s) to server]':'<header/@file>' \
  --ignore-content-length'[Ignore the size of the remote resource]' \
  {-i,--include}'[Include protocol response headers in the output]' \
  --preproxy'[\[protocol\://\]host\[\:port\] Use this proxy first]' \
  --proxy-header'[Pass custom header(s) to proxy]':'<header/@file>' \
  --unix-socket'[Connect through this Unix domain socket]':'<path>' \
  {-w,--write-out}'[Use output FORMAT after completion]':'<format>' \
  {-b,--cookie}'[Send cookies from string/file]':'<data|filename>' \
  {-o,--output}'[Write to file instead of stdout]':'<file>':_files \
  --socks4a'[SOCKS4a proxy on given host + port]':'<host[\:port]>' \
  {-U,--proxy-user}'[Proxy user and password]':'<user\:password>' \
  --proxy1.0'[Use HTTP/1.0 proxy on given port]':'<host[\:port]>' \
  {-Y,--speed-limit}'[Stop transfers slower than this]':'<speed>' \
  {-z,--time-cond}'[Transfer based on a time condition]':'<time>' \
  --alt-svc'[Enable alt-svc with this cache file]':'<file name>' \
  --capath'[CA directory to verify peer against]':'<dir>':_files \
  --connect-to'[Connect to host]':'<HOST1\:PORT1\:HOST2\:PORT2>' \
  {-f,--fail}'[Fail silently (no output at all) on HTTP errors]' \
  --http2-prior-knowledge'[Use HTTP 2 without HTTP/1.1 Upgrade]' \
  --proxy-tlspassword'[TLS password for HTTPS proxy]':'<string>' \
  {-r,--range}'[Retrieve only the bytes within RANGE]':'<range>' \
  --socks4'[SOCKS4 proxy on given host + port]':'<host[\:port]>' \
  --socks5'[SOCKS5 proxy on given host + port]':'<host[\:port]>' \
  {-A,--user-agent}'[Send User-Agent <name> to server]':'<name>' \
  --egd-file'[EGD socket path for random data]':'<file>':_files \
  --fail-early'[Fail on first transfer error, do not continue]' \
  {-x,--proxy}'[\[protocol\://\]host\[\:port\] Use this proxy]' \
  {-J,--remote-header-name}'[Use the header-provided filename]' \
  --retry-max-time'[Retry only within this period]':'<seconds>' \
  --cert-status'[Verify the status of the server certificate]' \
  {-:,--next}'[Make next URL use its separate set of options]' \
  --parallel-max'[Maximum concurrency for parallel transfers]' \
  --proxy-key-type'[Private key file type for proxy]':'<type>' \
  {-X,--request}'[Specify request command to use]':'<command>' \
  --retry'[Retry request if transient problems occur]':'<num>' \
  --ssl-no-revoke'[Disable cert revocation checks (Schannel)]' \
  --create-dirs'[Create necessary local directory hierarchy]' \
  --haproxy-protocol'[Send HAProxy PROXY protocol v1 header]' \
  --max-redirs'[Maximum number of redirects allowed]':'<num>' \
  {-n,--netrc}'[Must read .netrc for user name and password]' \
  --proxy-crlfile'[Set a CRL list for proxy]':'<file>':_files \
  --sasl-ir'[Enable initial response in SASL authentication]' \
  --socks5-gssapi-nec'[Compatibility with NEC SOCKS5 server]' \
  --ssl-allow-beast'[Allow security flaw to improve interop]' \
  --ftp-create-dirs'[Create the remote dirs if not present]' \
  --interface'[Use network INTERFACE (or address)]':'<name>' \
  --key-type'[Private key file type (DER/PEM/ENG)]':'<type>' \
  --netrc-file'[Specify FILE for netrc]':'<filename>':_files \
  {-N,--no-buffer}'[Disable buffering of the output stream]' \
  --proxy-service-name'[SPNEGO proxy service name]':'<name>' \
  --remote-name-all'[Use the remote file name for all URLs]' \
  {-u,--user}'[Server user and password]':'<user\:password>' \
  --max-filesize'[Maximum file size to download]':'<bytes>' \
  --negotiate'[Use HTTP Negotiate (SPNEGO) authentication]' \
  --no-keepalive'[Disable TCP keepalive on the connection]' \
  --output-dir'[Directory to save files in]':'<dir>':_files \
  {-#,--progress-bar}'[Display transfer progress as a bar]' \
  {-Q,--quote}'[Send command(s) to server before transfer]' \
  --retry-all-errors'[Retry all errors (use with --retry)]' \
  --socks5-gssapi'[Enable GSS-API auth for SOCKS5 proxies]' \
  {-K,--config}'[Read config from a file]':'<file>':_files \
  {-C,--continue-at}'[Resumed transfer offset]':'<offset>' \
  --data-raw'[HTTP POST data, '\''@'\'' allowed]':'<data>' \
  --hsts'[Enable HSTS with this cache file]':'<file name>' \
  --krb'[Enable Kerberos with security <level>]':'<level>' \
  --proxy-ciphers'[SSL ciphers to use for proxy]':'<list>' \
  --proxy-digest'[Use Digest authentication on the proxy]' \
  --proxy-tlsuser'[TLS username for HTTPS proxy]':'<name>' \
  --styled-output'[Enable styled output for HTTP headers]' \
  --tls-max'[Set maximum allowed TLS version]':'<VERSION>' \
  --data-urlencode'[HTTP POST data url encoded]':'<data>' \
  --delegation'[GSS-API delegation permission]':'<LEVEL>' \
  {-P,--ftp-port}'[Use PORT instead of PASV]':'<address>' \
  --post301'[Do not switch to GET after following a 301]' \
  --post302'[Do not switch to GET after following a 302]' \
  --post303'[Do not switch to GET after following a 303]' \
  --proxy-anyauth'[Pick any proxy authentication method]' \
  --request-target'[Specify the target for this request]' \
  --trace-time'[Add time stamps to trace/verbose output]' \
  --cert-type'[Certificate type (DER/PEM/ENG)]':'<type>' \
  --disallow-username-in-url'[Disallow username in url]' \
  --dns-servers'[DNS server addrs to use]':'<addresses>' \
  {-G,--get}'[Put the post data in the URL and use GET]' \
  --limit-rate'[Limit transfer speed to RATE]':'<speed>' \
  --ntlm-wb'[Use HTTP NTLM authentication with winbind]' \
  --path-as-is'[Do not squash .. sequences in URL path]' \
  --proxy-basic'[Use Basic authentication on the proxy]' \
  --retry-delay'[Wait time between retries]':'<seconds>' \
  --trace'[Write a debug trace to FILE]':'<file>':_files \
  {-a,--append}'[Append to target file when uploading]' \
  --ftp-ssl-ccc-mode'[Set CCC mode]':'<active/passive>' \
  --metalink'[Process given URLs as metalink XML file]' \
  --no-progress-meter'[Do not show the progress meter]' \
  --tr-encoding'[Request compressed transfer encoding]' \
  --xattr'[Store metadata in extended file attributes]' \
  --pass'[Pass phrase for the private key]':'<phrase>' \
  --proxy-ntlm'[Use NTLM authentication on the proxy]' \
  {-S,--show-error}'[Show error even when -s is used]' \
  --ciphers'[SSL ciphers to use]':'<list of ciphers>' \
  --form-string'[Specify multipart MIME data]':'<name=string>' \
  --login-options'[Server login options]':'<options>' \
  --tftp-blksize'[Set TFTP BLKSIZE option]':'<value>' \
  {-v,--verbose}'[Make the operation more talkative]' \
  --ftp-skip-pasv-ip'[Skip the IP address for PASV]' \
  --proxy-key'[Private key for HTTPS proxy]':'<key>' \
  --create-file-mode'[File mode for created files]' \
  {-F,--form}'[Specify multipart MIME data]':'<name=content>' \
  {-h,--help}'[Get help for commands]':'<category>' \
  --mail-from'[Mail from this address]':'<address>' \
  --oauth2-bearer'[OAuth 2 Bearer Token]':'<token>' \
  --proto'[Enable/disable PROTOCOLS]':'<protocols>' \
  --tftp-no-options'[Do not send any TFTP options]' \
  --tlsauthtype'[TLS authentication type]':'<type>' \
  --doh-url'[Resolve host names over DOH]':'<URL>' \
  --no-sessionid'[Disable SSL session-ID reusing]' \
  {-Z,--parallel}'[Perform transfers in parallel]' \
  --data-binary'[HTTP POST binary data]':'<data>' \
  --mail-rcpt'[Mail to this address]':'<address>' \
  {-t,--telnet-option}'[Set telnet option]':'<opt=val>' \
  --ftp-ssl-ccc'[Send CCC after authenticating]' \
  {-4,--ipv4}'[Resolve names to IPv4 addresses]' \
  {-6,--ipv6}'[Resolve names to IPv6 addresses]' \
  --service-name'[SPNEGO service name]':'<name>' \
  {-V,--version}'[Show version number and quit]' \
  --data-ascii'[HTTP POST ASCII data]':'<data>' \
  --ftp-account'[Account data string]':'<data>' \
  --disable-eprt'[Inhibit using EPRT or LPRT]' \
  --ftp-method'[Control CWD usage]':'<method>' \
  --netrc-optional'[Use either .netrc or URL]' \
  --pubkey'[SSH Public key file name]':'<key>' \
  --raw'[Do HTTP "raw"; no transfer decoding]' \
  --anyauth'[Pick any authentication method]' \
  --compressed'[Request compressed response]' \
  --ftp-pasv'[Use PASV/EPSV instead of PORT]' \
  --no-alpn'[Disable the ALPN TLS extension]' \
  --tcp-nodelay'[Use the TCP_NODELAY option]' \
  {-B,--use-ascii}'[Use ASCII/text transfer]' \
  --compressed-ssh'[Enable SSH compression]' \
  --digest'[Use HTTP Digest Authentication]' \
  --proxy-tlsv1'[Use TLSv1 for HTTPS proxy]' \
  --engine'[Crypto engine to use]':'<name>' \
  --no-npn'[Disable the NPN TLS extension]' \
  --basic'[Use HTTP Basic Authentication]' \
  {-M,--manual}'[Display the full manual]' \
  --false-start'[Enable TLS False Start]' \
  --crlf'[Convert LF to CRLF in upload]' \
  {-d,--data}'[HTTP POST data]':'<data>' \
  {-I,--head}'[Show document info only]' \
  --key'[Private key file name]':'<key>' \
  --ntlm'[Use HTTP NTLM authentication]' \
  {-e,--referer}'[Referrer URL]':'<URL>' \
  {-1,--tlsv1}'[Use TLSv1.0 or greater]' \
  --http0.9'[Allow HTTP 0.9 responses]' \
  --disable-epsv'[Inhibit using EPSV]' \
  --stderr'[Where to redirect stderr]' \
  --ftp-pret'[Send PRET before PASV]' \
  {-L,--location}'[Follow redirects]' \
  --tcp-fastopen'[Use TCP Fast Open]' \
  --tlsuser'[TLS user name]':'<name>' \
  --tlsv1.0'[Use TLSv1.0 or greater]' \
  --tlsv1.1'[Use TLSv1.1 or greater]' \
  --tlsv1.2'[Use TLSv1.2 or greater]' \
  --tlsv1.3'[Use TLSv1.3 or greater]' \
  {-l,--list-only}'[List only mode]' \
  {-q,--disable}'[Disable .curlrc]' \
  --url'[URL to work with]':'<url>' \
  {-0,--http1.0}'[Use HTTP 1.0]' \
  --ssl-reqd'[Require SSL/TLS]' \
  --tlspassword'[TLS password]' \
  {-s,--silent}'[Silent mode]' \
  --http1.1'[Use HTTP 1.1]' \
  {-2,--sslv2}'[Use SSLv2]' \
  {-3,--sslv3}'[Use SSLv3]' \
  --http3'[Use HTTP v3]' \
  --http2'[Use HTTP 2]' \
  --ssl'[Try SSL/TLS]' \
  '*:URL:_urls' && rc=0

return rc
